// terminal.h
#ifndef TERMINAL_H
#define TERMINAL_H

#include <QWidget>
#include <QProcess>
#include <QPlainTextEdit>
#include <QKeyEvent>
#include <QPushButton>
#include <QVBoxLayout>
#include <deque>
#include <QEventLoop>
#include <vector>

class TabManager;

class Terminal : public QPlainTextEdit {
    Q_OBJECT

public:
    Terminal(QWidget *parent = nullptr, TabManager *tabManager = nullptr);
    ~Terminal();
    void cdFilePath(QString path); // cd到当前代码的路径
    std::vector <std::pair<std::pair<int, int>, QString> > errorInfo;  // 用于记录编译报错信息:行号,列号,错误信息

protected:
    void keyPressEvent(QKeyEvent *event) override;  // 处理用户键入指令
    void inputMethodEvent(QInputMethodEvent *event) override;  // 处理中文输入法从缓冲区键入数据


public slots:
    void readOutput();  // 读取cmd输出
    void hideTerminal();
    void showTerminal();
    void toggleTerminal();
    bool onBuild();  // 返回是否编译成功
    void onRun();
    bool onBuildAndRun(); // 返回是否编译成功

private:
    QProcess *process;  // 终端的cmd进程
    QString currentCommand;
    QPushButton *hideButton;
    int inputPosition;
    int commandEnteredNumber = 0;  // 记录用户键入的几条数据
    QHBoxLayout *hLayout;
    QVBoxLayout *vLayout;
    QString output;
    std::deque <QString> commandQueue1, commandQueue2; // 对顶堆实现保存历史指令, front侧是更早的指令
    QString currentPath;  // 编译器运行的路径
    TabManager *tabManager = nullptr;
    QEventLoop loop;  // 用于等待编译器输出编译信息
    bool isCompilePass = 1;  // 用于记录编译是否通过
    QString exePath;
};

#endif // TERMINAL_H
